﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Administration.Entities;
using HerGoS.DAO;
using HerGoS.Interfaces;
using System.Data;
using HerGoS.Administration.Exceptions;

namespace HerGoS.Administration.Engine
{
   public class GestorEstadoCivil
    {
        /// <summary>
        /// Permite obtener el Estado Civil segun su identificador
        /// </summary>
        /// <param name="OID">Identificador</param>
        /// <returns>Estado Civil</returns>
       public static EstadoCivil Obtener(int OID)
       {
           try
           {
               IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
               repo.Nombre = "ESTADOCIVIL_SP";
               repo.AddParameter("@ACCION", "BYID");
               repo.AddParameter("@ID", OID);
               DataTable dt = repo.ExecuteDataTable();
               EstadoCivil result = dt.ToGenericList<EstadoCivil>(EstadoCivilConverter).FirstOrDefault();
               return result;
           }
           catch (Exception ex)
           {
               throw new EstadoCivilGetException(ex);
               
           }
       }              
       public static void Guardar(EstadoCivil estadoCivil)
       {
           try
           {
               IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryName);
               repo.Nombre = "ESTADOCIVIL_PROC";
               repo.AddParameter("@ACCION", estadoCivil.Persistencia);
               repo.AddParameter("@ID", estadoCivil.OID);
               repo.AddParameter("@CODIGO", estadoCivil.Codigo);
               repo.AddParameter("@DESCRIPCION", estadoCivil.Descripcion);
               repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
               estadoCivil.OID = repo.ExecuteReturnValue().ToInteger();
               repo.Commit();
               
               GestorBitacora.Guardar(estadoCivil);
           }
           catch (Exception ex)
           {
               throw new EstadoCivilSetException(ex);
           }
       }
       public static void Eliminar(EstadoCivil estadoCivil)
       {
           estadoCivil.Persistencia = EstadoPersistencia.DELETE;
           Guardar(estadoCivil);
           estadoCivil.Persistencia = EstadoPersistencia.UPDATE;
           estadoCivil.Activo = false;
       }
       public static void ReActivar(EstadoCivil estadoCivil)
       {
           estadoCivil.Persistencia = EstadoPersistencia.UNDELETE;
           Guardar(estadoCivil);
           estadoCivil.Persistencia = EstadoPersistencia.UPDATE;
           estadoCivil.Activo = true;
       }

       /// <summary>
       /// Permite consultar los Estados Civiles
       /// </summary>
       /// <param name="descripcion">Descripcion, o parte de el, del Estado Civil a consultar</param>
       /// <param name="activo">El estado de los Estados Civiles a consultar</param>
       /// <returns>Todos los Estados Civiles que coincidan con los filtros</returns>
       public static List<EstadoCivil> Consultar(string codigo, string descripcion, bool? activo)
       {
           try
           {
               IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
               repo.Nombre = "ESTADOCIVIL_SP";
               repo.AddParameter("@ACCION", "CONSULTA");
               repo.AddParameter("@ID", null);
               repo.AddParameter("@CODIGO", codigo);
               repo.AddParameter("@DESCRIPCION", descripcion);
               repo.AddParameter("@ACTIVO", activo);
               DataTable dt = repo.ExecuteDataTable();
               List<EstadoCivil> result = dt.ToGenericList<EstadoCivil>(EstadoCivilConverter);
               return result;
           }
           catch (Exception ex)
           {
               throw new EstadoCivilGetException(ex);
           }
       }

       /// <summary>
       /// Permite consultar los Estados Civiles
       /// </summary>
       /// <returns>Todos los Estados Civiles</returns>
       public static List<EstadoCivil> Consultar()
       {
           return Consultar(null, null, null);
       }

       /// <summary>
       /// Permite consultar los Estados Civiles activos
       /// </summary>
       /// <param name="descripcion">Descripcion, o parte de el, del Estado Civil a consultar</param>
       /// <returns>Todos los Estados Civiles que coincidan con los filtros</returns>
       public static List<EstadoCivil> Consultar(string codigo, string descripcion)
       {
           return Consultar(codigo, descripcion, true);
       }

       /// <summary>
       /// Permite consultar los Estados Civiles segun su estado
       /// </summary>
       /// <param name="activo">El estado de los Estados Civiles a consultar</param>
       /// <returns>Todos los Estados Civiles segun el estado seleccionado</returns>
       public static List<EstadoCivil> Consultar(bool activo)
       {
           return Consultar(null, null, activo);
       }

       #region Converter
       public static EstadoCivil EstadoCivilConverter(DataRow row)
       {
           return new EstadoCivil
           {
               OID = row["tecID"].ToInteger(),
               Persistencia = EstadoPersistencia.UPDATE,
               Codigo = row["tecCODIGO"].ToString(),
               Descripcion = row["tecDESCRIPCION"].ToString(),
               Activo = row.IsNull("FECHA_BAJA") ? true : false
           };
       }
       #endregion



    }
}


